package com.gzz.common.base;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.springframework.util.StringUtils;

import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

/**
 * @功能说明 【拼加条件】基类
 * @author 高振中
 * @date 2021-03-04 20:20:20
 */
@Setter
@Getter
public abstract class BaseCondition {

	private static final List<Object> paramList = new ArrayList<>();// 参数值
	private static final StringBuffer condition = new StringBuffer();// 条件语句

	@ApiModelProperty("排序字条件如:'id,name DESC'")
	private String orders = "";
	@ApiModelProperty("页大小")
	private Integer size = 10;// 页大小(每页记录条)
	@ApiModelProperty("当前页")
	private Integer page = 0;// 当前页码
	@ApiModelProperty(hidden = true)
	private Byte dr;

	/**
	 * @功能说明: 拼加条件使用等于大于小于...运算符(Object类型)
	 */
	final protected void add(final String sql, final Object value) {
		if (!StringUtils.isEmpty(sql) && value != null) {
			condition.append(" " + sql);
			paramList.add(value);
		}
	}

	/**
	 * @功能说明 拼加条件in子句
	 */
	final protected void add(final String sql, final Object[] ids) {
		if (!StringUtils.isEmpty(sql) && ids != null) {
			condition.append(" " + sql + toIn(ids));
			paramList.addAll(Arrays.asList(ids));
		}
	}

	/**
	 * @功能说明 拼加条件使用like关键字模糊查询时
	 */
	final protected void add(final String sql, final String value, final int pos) {
		if (!StringUtils.isEmpty(value)) {
			condition.append(" " + sql);
			if (pos == 1) {
				paramList.add("%" + value);
			} else if (pos == 2) {
				paramList.add(value + "%");
			} else if (pos == 3) {
				paramList.add("%" + value + "%");
			}
		}
	}

	/**
	 * @功能说明 不使用占位符直接拼SQL(不建议使用)
	 */
	final protected void add(final String sql) {
		if (!StringUtils.isEmpty(sql)) {
			condition.append(" " + sql);
		}
	}

	/**
	 * @功能说明 将List转为数组
	 */
	final public Object[] array() {
		return paramList.toArray();
	}

	/**
	 * @功能说明 把一个and换成where
	 */
	final public String where() {
		return and().replaceFirst("(?i)(AND)", "WHERE");
	}

	/**
	 * @功能说明 取条件字符串
	 */
	final public String and() {
		condition.setLength(0); // 清除查询条件
		paramList.clear();
		addCondition();
// 		add("AND t.dr = ?", dr);
		return condition.toString();
	}

	/**
	 * @方法说明 把组数拼接成(?,?,?)的形式
	 */
	final public static String toIn(final Object... ids) {
		StringBuffer sb = new StringBuffer(" (?");
		for (int i = 1; i < ids.length; i++) {
			sb.append(",?");
		}
		sb.append(")");
		return sb.toString();
	}

	/**
	 * @功能说明 拼加条件方法
	 */
	public abstract void addCondition();

	public String getOrders() {
		if (StringUtils.isEmpty(orders))
			return "";
		return " ORDER BY " + orders;
	}
}
